package queue;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-12-13 19:39
 **/
public class Test_LinkedBlockingQueue {

    /**
     * BlockingQueue 阻塞队列
     * blockingQueue.put() ,加不进去则等待
     * blockingQueue.take(), 取不出来则等待
     * BlockingQueue 基本就是生产者和消费者的模型
     */

    static BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>();

    static Random random = new Random();

    public static void main(String[] args) {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    blockingQueue.put("a" + i); //如果满了，就会等待，直到可以添加
                    TimeUnit.MILLISECONDS.sleep(random.nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "p1").start();

        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                for (; ; ) {
                    try {
                        //如果空了，就会等待，直到可以取出数据
                        System.out.println(Thread.currentThread().getName() + " take -" + blockingQueue.take());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "c" + i).start();

        }
    }


    public static void api() {

        /**
         * 将元素添加到队列，一般都可以添加成功，如果不成功则发挥 false
         */
        boolean offer = blockingQueue.offer("");
        /**
         * 将元素添加到队列，一般都可以添加成功，如果不成功则抛出异常
         */
        blockingQueue.add("");
        /**
         * 从队列中取出头部数据并删除队列中的头部数据
         */
        String poll = blockingQueue.poll();
        /**
         * 从队列中取出头部数据，但是不删除队列中的数据
         */
        blockingQueue.peek();
        try {
            /**
             * 将指定数据加入到队列中，如果队列已经满了则等待添加，并且程序进入阻塞状态
             */
            blockingQueue.put("");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        try {
            /**
             * 从队列中取出元素，如果队列中没有元素则程序进入阻塞状态等待被唤醒
             */
            String take = blockingQueue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        /**
         * 删除队列中的头部数据，如果队列为空则抛出异常
         */
        String remove = blockingQueue.remove();




    }

}
